package com.easy.auth.controller;

import com.easy.common.bean.SysUser;
import com.easy.common.exception.ParameterException;
import com.easy.common.service.IUserService;
import com.easy.common.util.JWTUtil;
import com.easy.common.util.ResultData;
import com.easy.common.util.SYSUtil;
import com.easy.common.util.PasswordEncode;
import org.apache.dubbo.config.annotation.DubboReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("auth")
@CrossOrigin
public class AuthController {

    private static final Logger logger = LoggerFactory.getLogger(AuthController.class);

    @DubboReference
    IUserService userService;

    @PostMapping("login")
    public ResultData login(@RequestBody SysUser user) {
        try {
            String username = user.getUsername();
            String password = user.getPassword();
            // 验证参数
            if (SYSUtil.checkNotEmpty(username, password)) {
                logger.info("开始通过用户名 {} 获取用户数据", username);
                // 通过用户名获取用户数据
                // 需要访问User模块中的服务
                SysUser sysUser = userService.getByUsername(username);

                if (SYSUtil.checkNotNull(sysUser)) {
                    String password_data = sysUser.getPassword();
                    if (PasswordEncode.decode(password, password_data)) {
                        logger.info("用户 {} 登录成功，开始签发 token", username);
                        // 将用户信息和角色信息放入 Map 中
                        Map<String, Object> claims = new HashMap<>();
                        claims.put("username", sysUser.getUsername());
                        // 这里可以根据实际情况从数据库中获取用户角色，暂时使用硬编码示例
                        claims.put("roles", Arrays.asList("user::insert", "user::delete"));

                        // 成功签发token
                        String token = JWTUtil.generateToken(claims);
                        return ResultData.success(token);
                    } else {
                        logger.warn("用户 {} 密码错误", username);
                        return ResultData.fail("密码错误");
                    }
                } else {
                    logger.warn("没有找到用户名 {} 对应的账号", username);
                    throw new RuntimeException("没有此账号");
                }
            } else {
                logger.warn("登录请求参数异常，用户名: {}, 密码: {}", username, password);
                throw new ParameterException("参数异常");
            }
        } catch (Exception e) {
            logger.error("登录过程中出现异常", e);
            return ResultData.fail("登录失败: " + e.getMessage());
        }
    }
}